/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.cip.esymons.tesoreria.beans;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.cip.esymons.general.util.ControladorAbstracto;
import java.util.List;
import javax.faces.model.SelectItem;
import org.cip.esymons.tesoreria.bc.TipoCambioDelegate;
import org.cip.esymons.tesoreria.bc.TipoMonedaDelegate;
import org.cip.esymons.tesoreria.be.EnumEstadoTipoMoneda;
import org.cip.esymons.tesoreria.be.TipoCambio;
import org.cip.esymons.tesoreria.be.TipoMoneda;

/**
 *
 * @author Ingrid Capunay
 */
public class TipoMonedaController extends ControladorAbstracto {

    private TipoMonedaDelegate delegado;
    private TipoMoneda tipoMoneda;
    private TipoMoneda monedaDefectoSeleccionada;
    private TipoCambioDelegate delegadoTipoCambio;
    private TipoCambio tipoCambio;

    public TipoMonedaController() {
        delegado = new TipoMonedaDelegate();
        delegadoTipoCambio = new TipoCambioDelegate();
    }

    /**
     * @return the cuentaContable
     */
    public TipoMoneda getTipoMoneda() {
        return tipoMoneda;
    }

    /**
     * @param cuentaContable the cuentaContable to set
     */
    public void setTipoMoneda(TipoMoneda tipoMoneda) {
        this.tipoMoneda = tipoMoneda;
    }

    public List<TipoMoneda> getListaMonedas() {
        return delegado.findAll();
    }

    public String nuevo() {
        tipoMoneda = new TipoMoneda();
        return "nuevo";
    }

    public String fijarMonedaDefecto() {
        return "interfazFijarMoneda";
    }

    public String grabar() {
        tipoMoneda.setEstado(EnumEstadoTipoMoneda.Activa);
        delegado.create(tipoMoneda);
        ControladorAbstracto.info("Se insertó satisfactoriamente el Tipo de Moneda.");
        return "buscar";
    }

    public String buscar() {
        return null;
    }

    public String actualizar() {
        delegado.edit(tipoMoneda);
        ControladorAbstracto.info("Se actualizó satisfactoriamente el Tipo de Moneda.");
        return "buscar";
    }

    public String anular() {
        tipoMoneda.setEstado(EnumEstadoTipoMoneda.Anulada);
        delegado.edit(tipoMoneda);
        return null;
    }

    public String grabarFijacionMoneda() {
        if (monedaDefectoSeleccionada.getEstado().equals(EnumEstadoTipoMoneda.Activa)) {
            monedaDefectoSeleccionada.setMonedaDefecto(true);
            delegado.edit(monedaDefectoSeleccionada);
            List<TipoMoneda> lmnd = delegado.devolverMonedasNoSonPorDefecto(monedaDefectoSeleccionada);
            int tamano = lmnd.size();
            int i;
            for (i = 0; i <= tamano - 1; i++) {
                TipoMoneda monedaAcambiar = lmnd.get(i);
                monedaAcambiar.setMonedaDefecto(false);
                delegado.edit(monedaAcambiar);
            }
            List<TipoCambio> ltp = delegadoTipoCambio.findAll();
            for (TipoCambio tc : ltp) {
                SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
                String fechaActual = sdf.format(new Date());
                String fechaTipoCambio = sdf.format(tc.getTpcFecha());

                int resFecha = 0;
                try {
                    resFecha = sdf.parse(fechaTipoCambio).compareTo(sdf.parse(fechaActual));
                } catch (ParseException ex) {
                    Logger.getLogger(TipoMonedaController.class.getName()).log(Level.SEVERE, null, ex);
                }
                if (resFecha >= 0) {
                    tc.setTmocodigoDefecto(monedaDefectoSeleccionada);
                    delegadoTipoCambio.edit(tc);
                }
            }
            ControladorAbstracto.info("Se fijó el Tipo de Moneda por Defecto.");
            return "ir_a_buscarMoneda";
        } else {
            ControladorAbstracto.error("La moneda tiene que estar ACTIVA para la fijación");
            return null;

        }

    }

    public TipoMoneda buscarPorCodigo(Long codigo) {
        try {
            return delegado.find(codigo);
        } catch (Exception ex) {
            return null;
        }
    }

    public SelectItem[] getTipoMonedaItem() {
        try {
            List<TipoMoneda> lc = delegado.findAll();
            SelectItem[] select = new SelectItem[lc.size()];
            int i = 0;
            for (TipoMoneda tm : lc) {
                SelectItem item = new SelectItem(tm, tm.getTmoDesc());
                select[i++] = item;
            }

            return select;
        } catch (Exception ex) {
            SelectItem[] select = new SelectItem[1];
            SelectItem item = new SelectItem(null, "No existen Tipo Moneda");
            select[0] = item;
            return select;
        }
    }

    public SelectItem[] getEstadoTipoMonedaItems() {
        try {
            SelectItem[] select = new SelectItem[EnumEstadoTipoMoneda.values().length];
            int cont = 0;
            for (EnumEstadoTipoMoneda e : EnumEstadoTipoMoneda.values()) {
                select[cont] = new SelectItem(e, e.name());
                cont++;
            }
            return select;
        } catch (Exception ex) {
            SelectItem[] select = new SelectItem[1];
            select[0] = new SelectItem(null, "No existen Estados");
            return select;
        }
    }

    /**
     * @return the monedaDefectoSeleccionada
     */
    public TipoMoneda getMonedaDefectoSeleccionada() {
        return monedaDefectoSeleccionada;
    }

    /**
     * @param monedaDefectoSeleccionada the monedaDefectoSeleccionada to set
     */
    public void setMonedaDefectoSeleccionada(TipoMoneda monedaDefectoSeleccionada) {
        this.monedaDefectoSeleccionada = monedaDefectoSeleccionada;
    }

    /**
     * @return the tipoCambio
     */
    public TipoCambio getTipoCambio() {
        return tipoCambio;
    }

    /**
     * @param tipoCambio the tipoCambio to set
     */
    public void setTipoCambio(TipoCambio tipoCambio) {
        this.tipoCambio = tipoCambio;
    }
}
